package main

import (
	"flag" //flag包实现了命令行参数的解析。
	"fmt"
	"os"
)

/**

 */
type Cmd struct {
	helpFlag    bool     // 命令行参数 help ： 帮助命令
	versionFlag bool     // 命令行参数 version ： 版本信息
	cpOption    string   // 命令行参数 cp/classpath ： 指定 系统(用户) 类加载器 加载类的路径
	XjreOption  string   // 命令行参数 Xjre :指定 引导 类加载器 和 扩展 类加载器 加载类的路径
	class       string   //  类名称，非flag参数集合的第一个元素
	args        []string //切片slice  参数 ，非flag参数集合的其他元素
}

func printUsage() {
	// os.Args : Args保管了命令行参数，第一个是程序名
	fmt.Printf("Usage : %s [-options] class [args...]\n", os.Args[0])
}
func parseCmd() *Cmd {
	cmd := &Cmd{}
	flag.Usage = printUsage
	// 注册flag 参数含义：接收变量，flag名称，默认值，描述
	flag.BoolVar(&(cmd.helpFlag), "help", false, "print help message")
	flag.BoolVar(&(cmd.helpFlag), "?", false, "print help message")
	flag.BoolVar(&(cmd.versionFlag), "version", false, "print version and exit")
	flag.StringVar(&(cmd.cpOption), "classpath", "", "classpath")
	flag.StringVar(&(cmd.cpOption), "cp", "", "classpath")
	flag.StringVar(&(cmd.XjreOption), "Xjre", "", "path to jre")
	// 解析 注册的flag
	flag.Parse()
	args := flag.Args() //返回解析之后剩下的非flag参数。（不包括命令名）
	if len(args) > 0 {
		cmd.class = args[0]
		cmd.args = args[1:] // 从数组中获取切片
	}
	return cmd
}
